#include<stdio.h>
#include<assert.h>
#include<unistd.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<sys/inotify.h>
#include<limits.h>
#include<fcntl.h>
#include <pthread.h>
#include "FolderInotify.h"
  
void inotifyEventLog(void *param, struct inotify_event *event)
{
    if(event->cookie > 0)
    {
        printf("cokkie = %4d; ",event->cookie);
    }

    if(event->len)
    {
        if(event->mask & IN_CREATE)
        {
            printf("CREATE %s\n",event->name);
        }
        else if(event->mask & IN_DELETE)
        {
            printf("DELETE %s\n",event->name);
        }
    }
}


// IN_ACCESS               文件被访问
// IN_ATTRIB               文件元数据改变
// IN_CLOSE_WRITE          关闭为了写入而打开的文件
// IN_CREATE               在受监控目录下创建了文件或目录
// IN_DELETE               在受监控目录内删除了文件或目录
// IN_DELETE_SELF          删除了受监控目录/文件本身
// IN_MODIFY               文件被修改
// IN_MODIFY_SELF          移动受监控目录或文件本身
// IN_MOVED_FROM           文件移除受监控目录
// IN_MOVED_TO         将文件移到受监控目录
// IN_OPEN                 文件被打开
// IN_ALL_EVENTS           以上所有输出事件的统称
// IN_MOVE             IN_MOVED_FROM | IN_MOVED_TO事件的统称
// IN_ONESHOT              只监控pathname的一个事件
// IN_ONLYDIR              pathname不为目录时会失败

void* InotifyThreadFun(void * arg)
{
    FolderInotify *folderInotify = (FolderInotify*)(arg);
    folderInotify->inotifyEventDeal = inotifyEventLog;
    folderInotify->dealParam = arg;
    folderInotify->mask = IN_DELETE | IN_CREATE;

    if ( folderInotify->init() ) 
    {
        folderInotify->inotifyAddWatch((char*)"./");
        folderInotify->run();
        return NULL;
    }
    else 
    {
        printf("init fail!\n");
    }
    return NULL;
}
  
int main(int argc,char **argv)
{
    FolderInotify folderInotify;
    pthread_t ptid;
    int ptre = pthread_create(&ptid, NULL, InotifyThreadFun, (void*)(&folderInotify));
    if (ptre != 0) 
    {
        printf("inputEventCtrl thread create fail!\n");
    } 
    else 
    {
        pthread_join(ptid, NULL);
    }



    return 0;
}
